package com.lmf.redis;

import redis.clients.jedis.Jedis;

import java.util.Random;

/**
 * 写一个手机验证码小程序：
 *      需求1：每次点击验证，就随机生成一个验证码
 *      需求2：每个手机号，每天最多验证三次
 *      需求3：每个验证码，有效时间是2分钟，并且存放在redis数据库中
 */
public class PhoneCode {

    public static void main(String[] args) {
        //测试验证码，能否正常获取
        String phone = "19983604254";
        Jedis jedis = new Jedis("192.168.111.128", 6379);
        String codeKey = "phoneVerifyCode:"+phone+":code";
        //模拟发送验证码
        sendPhoneAndVerifyCode(phone);
        //获取redis中的验证码值
        String code = jedis.get(codeKey);
        //校验
            verifyFunction(phone,code);
            jedis.close();
    }

    //验证码校验功能
    public static void  verifyFunction(String phone,String code){
        //连接redis数据库
        Jedis jedis = new Jedis("192.168.111.128", 6379);
        //从redis数据库中获取验证码
        String codeKey = "phoneVerifyCode:"+phone+":code";
        String s = jedis.get(codeKey);
        //判断手机号与验证码是否相等
        if (s.equals(code)) {
            System.out.println("成功!");
        }else {
            System.out.println("失败!");
        }
        //关闭redis数据库连接
        jedis.close();
    }

    //需求3：每个验证码，有效时间是2分钟，并且存放在redis数据库中
    public static void sendPhoneAndVerifyCode(String phone){//传入手机号
        //连接redis
        Jedis jedis = new Jedis("192.168.111.128", 6379);
        //设置手机号验证次数key值
        String phoneKey = "phone:"+phone+":count";
        //设置验证码key值
        String codeKey = "phoneVerifyCode:"+phone+":code";
        //获取手机号验证次数key值
        String count = jedis.get(phoneKey);
        if (count == null) {
            //没有发送次数，第一次发送,设置发送次数是1,且设置过期时间为一天
            //将数据存到redis里面
            jedis.setex(phoneKey,24*60*60,"1");
        }else if (Integer.parseInt(count) <= 2){
            //若验证次数小于三次，则再次发送
            jedis.incr(phoneKey);
        }else if (Integer.parseInt(count) > 2){
            //给出提示
            System.out.println("今天该手机号发送次数已经超过三次，请明天再继续！");
            //关闭redis数据库连接
            jedis.close();
            return;
        }
        //接收验证码
        String vcode = getVerifyCode();
        //将验证码存到redis里面
        jedis.setex(codeKey,120,vcode);
        //关闭redis数据库连接
        jedis.close();
    }

    //随机生成验证码
    public static String getVerifyCode(){
        Random random = new Random();
        String code = "";
        for (int i = 0; i < 6; i++) {
            //每次随机生成一位整数
            int nextInt = random.nextInt(10);
            //将每次生成的随机数，拼接为一个六位的验证码
            code += nextInt;
        }
        return code;
    }
}
